package edu.eam.paii.proyecto.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import edu.eam.paii.proyecto.dao.ClienteDAO;
import edu.eam.paii.proyecto.dao.CuentaDAO;
import edu.eam.paii.proyecto.dao.EntidadDAO;
import edu.eam.paii.proyecto.dao.ProductoDAO;
import edu.eam.paii.proyecto.dao.SolicitudCreditoDAO;
import edu.eam.paii.proyecto.dao.TransaccionDAO;
import edu.eam.paii.proyecto.dao.TurnoDAO;
import edu.eam.paii.proyecto.entidades.Ahorro_CDT;
import edu.eam.paii.proyecto.entidades.Cliente;
import edu.eam.paii.proyecto.entidades.Cliente_Premio;
import edu.eam.paii.proyecto.entidades.Consignacion;
import edu.eam.paii.proyecto.entidades.Credito;
import edu.eam.paii.proyecto.entidades.Credito_Vivienda;
import edu.eam.paii.proyecto.entidades.Cuenta;
import edu.eam.paii.proyecto.entidades.CuentaExterna;
import edu.eam.paii.proyecto.entidades.Cuota;
import edu.eam.paii.proyecto.entidades.Direccion;
import edu.eam.paii.proyecto.entidades.Pago_Facturas;
import edu.eam.paii.proyecto.entidades.Servicio;
import edu.eam.paii.proyecto.entidades.SolicitudTarjetaCredito;
import edu.eam.paii.proyecto.entidades.Solicitud_Credito;
import edu.eam.paii.proyecto.entidades.Tarjeta_Credito;
import edu.eam.paii.proyecto.entidades.Tipo;
import edu.eam.paii.proyecto.entidades.Tipo_Credito;
import edu.eam.paii.proyecto.entidades.Transaccion;
import edu.eam.paii.proyecto.entidades.Transferencia;
import edu.eam.paii.proyecto.entidades.TransferenciaCuentaCuenta;
import edu.eam.paii.proyecto.entidades.Turno;

/**
 * Session Bean implementation class BankEJB
 */
@Stateless
public class BankEJB implements BankEJBRemote, BankEJBLocal {

	@PersistenceContext
	private EntityManager em;
	private TransaccionDAO transaccionDao;
	private ClienteDAO clienteDao;
	private CuentaDAO cuentaDao;
	private ProductoDAO productoDao;
	private SolicitudCreditoDAO solicitudDao;
	private TurnoDAO turnoDAO;
	private EntidadDAO entidadDAO;

	/**
	 * Default constructor.
	 */
	public BankEJB() {
		// TODO Auto-generated constructor stub
		transaccionDao = new TransaccionDAO(em);
		clienteDao = new ClienteDAO(em);
		cuentaDao = new CuentaDAO(em);
		productoDao = new ProductoDAO(em);
		solicitudDao = new SolicitudCreditoDAO(em);
		turnoDAO = new TurnoDAO(em);
		entidadDAO=new EntidadDAO(em);
	}

	@Override
	public void CrearTransferencia(int cuentaOrigen, int cuentaDestino,
			double monto, Date fecha, int turno, int cliente) throws Exception {
	

		ArrayList<Transaccion> transacciones = (ArrayList<Transaccion>) transaccionDao
				.listarTransacciones();
		int nro_Transaccion = 0;
		if (transacciones != null) {

			nro_Transaccion = transacciones.get(transacciones.size())
					.getNro_Transaccion() + 1;

		}
		Turno turnoTransaccion = turnoDAO.buscarTurno(turno);
		Cliente clienteTransaccion = clienteDao.buscar(cliente);
		Cuenta cuentaOrigenX = cuentaDao.buscar(cuentaOrigen);
		Cuenta cuentaDestinox = cuentaDao.buscar(cuentaDestino);
		Transferencia transferencia = new Transferencia(nro_Transaccion, fecha,
				monto, turnoTransaccion, clienteTransaccion, cuentaOrigenX,
				cuentaDestinox);

		transaccionDao.crearTransferencia(transferencia);

	}

	@Override
	public void CrearTransferenciaCuentaCuenta(int nro_Transaccion, Date fecha,
			Double monto, int turnoTransaccion, int clienteTransaccion,
			int cuentaOrigen, int cuentaDestino) {


		ArrayList<Transaccion> transacciones = (ArrayList<Transaccion>) transaccionDao
				.listarTransacciones();
		int nro_Transac = 0;
		if (transacciones != null) {

			nro_Transac = transacciones.get(transacciones.size())
					.getNro_Transaccion() + 1;

		}
		Turno turnoTransac = turnoDAO.buscarTurno(turnoTransaccion);
		Cliente clienteTransac = clienteDao.buscar(clienteTransaccion);
		Cuenta cuentaOrigenX = cuentaDao.buscar(cuentaOrigen);
		CuentaExterna cuentaDestinox = cuentaDao
				.buscarCuentaExterna(cuentaDestino);
		TransferenciaCuentaCuenta transac = new TransferenciaCuentaCuenta(
				nro_Transac, fecha, monto, turnoTransac, clienteTransac,
				cuentaOrigenX, cuentaDestinox);

		transaccionDao.crearTransferenciaCuentaCuenta(transac);


	}

	@Override
	public void registrarCliente(int cedula, String nombre, String apellidos,
			int telefono, String correo, Direccion direccionPersona,
			String usuario, String contrasena, double ingresos, double egresos) {


		Cliente cliente = new Cliente(cedula, nombre, apellidos, telefono,
				correo, direccionPersona, usuario, contrasena, ingresos,
				egresos);

		clienteDao.crear(cliente);

	}

	

	@Override
	public void crearConsignacion( Date fecha,
			Double monto, int turnoTransaccion, int clienteTransaccion,
			int tipoConsignacion, int nroCuentaConsignacion) {
		// TODO Auto-generated method stub

		ArrayList<Transaccion> transacciones = (ArrayList<Transaccion>) transaccionDao
				.listarTransacciones();
		int nro_Transac = 0;
		if (transacciones != null) {

			nro_Transac = transacciones.get(transacciones.size())
					.getNro_Transaccion() + 1;

		}
		
		
		Consignacion con= new Consignacion(nro_Transac, fecha, monto, turnoDAO.buscarTurno(turnoTransaccion), clienteDao.buscar(clienteTransaccion),
				transaccionDao.buscarTipoConsignacion(tipoConsignacion), cuentaDao.buscar(nroCuentaConsignacion));
		transaccionDao.crearConsignacion(con);
	}

	@Override
	public void asociarCuentaExterna(int nro_Cuenta, String entidad, int nro_Entidad) {
		// TODO Auto-generated method stub
		ArrayList<CuentaExterna> cuentasE = (ArrayList<CuentaExterna>) cuentaDao
		.listarExternas();
int nro_Cuentas = 0;
if (cuentasE != null) {

	nro_Cuentas = cuentasE.get(cuentasE.size())
			.getIdCuenta() + 1;

}
		
		em.persist(new CuentaExterna(nro_Cuenta, nro_Cuentas, entidad, entidadDAO.buscar(nro_Entidad)));
		
	}

	@Override
	public void crear(int nro_Cuenta, Date fecha_Creacion, int clienteCuenta,
			double saldo, int nroEntidadCuenta) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<Cuenta> listar() {
		// TODO Auto-generated method stub
		return cuentaDao.listar();
	}

	@Override
	public List<CuentaExterna> listarExternas() {
		// TODO Auto-generated method stub
		return cuentaDao.listarExternas();
	}

	@Override
	public void update(int nro_Cuenta,double saldo) {
		// TODO Auto-generated method stub
		Cuenta cuenta=cuentaDao.buscar(nro_Cuenta);
		cuenta.setSaldo(saldo);
		
		cuentaDao.update(cuenta);
	}

	@Override
	public Cuenta buscar(int nro_Cuenta) {
		// TODO Auto-generated method stub
		return cuentaDao.buscar(nro_Cuenta);
	}

	@Override
	public CuentaExterna buscarCuentaExterna(int nro_cuenta) {
		// TODO Auto-generated method stub
		return cuentaDao.buscarCuentaExterna(nro_cuenta);
	}

	@Override
	public Cliente buscarCliente(int cedula) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void eliminar(int cliente) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Cliente editar(int telefono, String correo,
			Direccion direccionPersona, String contrasena, double ingresos,
			double egresos, List<SolicitudTarjetaCredito> solicitudeTarjetaC,
			List<Pago_Facturas> pagosFacturasCliente,
			List<Tarjeta_Credito> tarjetas_Creditos, List<Cuenta> cuentas,
			List<Ahorro_CDT> ahorro_CDTs, List<Transaccion> transaccionCliente,
			Servicio servicioCliente,
			List<Solicitud_Credito> solicitudes_Creditos,
			List<Credito> creditos, List<Transaccion> transacciones,
			List<Cliente_Premio> premios) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Cliente> listarClientes() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Credito> listarCreditosCliente(String cedula) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Cuenta> listarCuentasCLiente(String cedula) {
		// TODO Auto-generated method stub
		return null;
	}

	
	

}
